Instrução: Estabelecimento anteriores a 2020, com registro de leitos covid-19 (com as Descrições: “51-UTI II ADULTO-SINDROME RESP. AGUDA GRAVE (SRAG)-COVID-19” ou “52”- UTI II PEDIATRICA-SINDROME RESP. AGUDA GRAVE (SRAG)-COVID-19” ou “96- SUPORTE VENTILATÓRIO PULMONAR - COVID-19”).
Primeiramente, preciso saber quais eram os estabelecimentos que já existiam em 2019. Para feitos de análise, foram acessados os estabelecimentos nas competências 12 (Dezembro) de 2019.
cnes_2019 <- df %>%
filter(COMPETEN == "201912") %>%
distinct(CNES, FANTASIA, RAZ_SOCI)
cnes_2019c <- cnes_2019$CNES
leitos <- c(51, 52, 96)
cnes_20_21_exist <- df %>%
filter(COMPETEN == "202012" | COMPETEN == "202112") %>%
filter(CNES %in% cnes_2019c) %>%
filter(CODLEITO %in% leitos) %>%
select(COMPETEN, uf, CODUFMUN, municipio_pad, regiao, CNES, FANTASIA, RAZ_SOCI,
CODLEITO, QT_EXIST)
Os estabelecimentos que cumprem os requisitos estão listados abaixo.
Temos a seguinte situação em termos de leitos no último mês de 2020 e 2021, respectivamente.
c <- cnes_20_21_exist %>%
mutate(Ano = as.integer(substr(COMPETEN, 1, 4))) %>%
group_by(Ano, regiao) %>%
summarise(qtd_existente = sum(QT_EXIST)) %>%
ggplot(aes(x = Ano, y = qtd_existente, col = regiao)) + geom_line() +
scale_x_continuous(breaks = seq(2020,2021,1)) +
theme_minimal() + ylab("Quantidade existente") + ggtitle("Quantidade de leitos existentes",
"Fonte: CNES-LT")
plotly::ggplotly(c)
O próximo passo é identificar quantos hospitais que já existiam em 2019 e tinham leitos covid em 2020 e 2021.
cnes20 <- cnes_20_21_exist %>%
filter(COMPETEN == "202012") %>%
distinct(CNES, FANTASIA, RAZ_SOCI, uf, regiao) %>%
group_by(regiao) %>%
summarise(total = n()) %>%
mutate(ano = 2020)
cnes20_c <- cnes_20_21_exist %>%
filter(COMPETEN == "202012") %>%
distinct(CNES)
cnes20_c <- cnes20_c$CNES
cnes21 <- cnes_20_21_exist %>%
filter(COMPETEN == "202112") %>%
filter(CNES %ni% cnes20_c) %>%
distinct(CNES, FANTASIA, RAZ_SOCI, uf, regiao) %>%
group_by(regiao) %>%
summarise(total = n()) %>%
mutate(ano = 2021)
cnes_novos <- rbind(cnes20, cnes21)
d <- cnes_novos %>%
ggplot(aes(x = ano, y = total, fill = regiao)) + geom_col(position = "dodge") +
theme_minimal() + scale_x_continuous(breaks = seq(2020,2021,1)) +
ylab("Quantidade de estabelecimentos") + ggtitle("Quantidade de estabelecimentos existentes em cada ano",
"Fonte: CNES-LT")
plotly::ggplotly(d)
Instrução: Estabelecimentos criados entre 2020 e 2021, com o termo “COVID” em seu nome fantasia e (+) aqueles com leito com as descrições: “51-UTI II ADULTO-SINDROME RESP. AGUDA GRAVE (SRAG)-COVID-19” ou “52 - UTI II PEDIATRICA-SINDROME RESP. AGUDA GRAVE (SRAG)-COVID-19” ou “96- SUPORTE VENTILATÓRIO PULMONAR - COVID-19”).
Primeiramente, preciso saber quais eram os estabelecimentos que foram criados nos anos de 2020 e 2021. Para isso, vou excluir todos os estabelecimentos que já existiam em 2019, pegando apenas os novos os anos subsequentes.
Para feitos de análise, foram acessados os estabelecimentos nas competências 12 (Dezembro) de cada ano.
cnes_2019 <- df %>%
filter(COMPETEN == "201912") %>%
distinct(CNES, FANTASIA, RAZ_SOCI)
cnes_2019c <- cnes_2019$CNES
leitos <- c(51, 52, 96)
cnes_20_21_novos <- df %>%
filter(COMPETEN == "202012" | COMPETEN == "202112") %>%
filter(CNES %ni% cnes_2019c) %>%
filter(str_detect(FANTASIA, "covid") | CODLEITO %in% leitos) %>%
select(COMPETEN, uf, CODUFMUN, municipio_pad, regiao, CNES, FANTASIA, RAZ_SOCI,
CODLEITO, QT_EXIST)
Os estabelecimentos que cumprem os requisitos estão listados abaixo.
Temos a seguinte situação em termos de leitos no último mês de 2020 e 2021 respectivamente.
a <- cnes_20_21_novos %>%
mutate(Ano = as.integer(substr(COMPETEN, 1, 4))) %>%
group_by(Ano, regiao) %>%
summarise(qtd_existente = sum(QT_EXIST)) %>%
ggplot(aes(x = Ano, y = qtd_existente, col = regiao)) + geom_line() +
scale_x_continuous(breaks = seq(2020,2021,1)) +
theme_minimal() + ylab("Quantidade existente") + ggtitle("Quantidade de leitos existentes",
"Fonte: CNES-LT")
plotly::ggplotly(a)
O próximo passo é identificar quantos hospitais novos foram criados cada ano
cnes20 <- cnes_20_21_novos %>%
filter(COMPETEN == "202012") %>%
distinct(CNES, FANTASIA, RAZ_SOCI, uf, regiao) %>%
group_by(regiao) %>%
summarise(total = n()) %>%
mutate(ano = 2020)
cnes20_c <- cnes_20_21_novos %>%
filter(COMPETEN == "202012") %>%
distinct(CNES)
cnes20_c <- cnes20_c$CNES
cnes21 <- cnes_20_21_novos %>%
filter(COMPETEN == "202112") %>%
filter(CNES %ni% cnes20_c) %>%
distinct(CNES, FANTASIA, RAZ_SOCI, uf, regiao) %>%
group_by(regiao) %>%
summarise(total = n()) %>%
mutate(ano = 2021)
cnes_novos <- rbind(cnes20, cnes21)
b <- cnes_novos %>%
ggplot(aes(x = ano, y = total, fill = regiao)) + geom_col(position = "dodge") +
theme_minimal() + scale_x_continuous(breaks = seq(2020,2021,1)) +
ylab("Quantidade de estabelecimentos") + ggtitle("Quantidade de estabelecimentos novos em cada ano",
"Fonte: CNES-LT")
plotly::ggplotly(b)
O gráfico acima apresenta o total de estabelecimentos criados segundo as instruções do indicador nos últimos dois anos.
Instruções: não há instrução para este indicador. Suponho que neste caso, precisamos contabilizar o total por hospitais que já existiam, alinhado ao indicador 1. O respirador é um equipamento cujo código é 64.
df3 <- sqlQuery(channel, 'SELECT a.COMPETEN, a.CNES, a.CODUFMUN, municipio_pad, a.uf, regiao, SUM(QT_EXIST) AS QTD
FROM Dados.cnes.EQ a
LEFT JOIN "Analytics Layer".Territorial."Municípios - Hierarquia Completa" c
ON CAST(a.CODUFMUN AS INT) = c.cod_municipio
WHERE CAST(CODEQUIP AS INT) = 64
GROUP BY CNES, CODUFMUN, COMPETEN, municipio_pad, a.uf, regiao')
Vamos pegar os mesmos estabelecimentos que filtramos no indicador 1.
df3_t <- df3 %>%
filter(CNES %in% cnes_2019c) %>%
mutate(mes_ano = lubridate::ym(COMPETEN)) %>%
group_by(regiao, mes_ano) %>%
summarise(total = sum(QTD)) %>%
filter(mes_ano > "2019-12-01") %>%
filter(regiao != "NA")
DT::datatable(df3_t)
e <- df3_t %>%
ggplot(aes(x = mes_ano, y = total, col = regiao)) + geom_line() +
facet_wrap(~regiao, scales = "free_y") + theme_minimal() +
scale_x_date(date_breaks = "1 year") + theme(legend.position="none")
plotly::ggplotly(e)
Vamos levantar o número de respiradores naqueles estabelecimentos que incluíram leitos covid apenas a partir de 2020, conforme extraído no indicador 2.
df_4 <- df3 %>%
filter(CNES %ni% cnes_2019c) %>%
mutate(mes_ano = lubridate::ym(COMPETEN)) %>%
group_by(regiao, mes_ano) %>%
summarise(total = sum(QTD)) %>%
filter(mes_ano > "2019-12-01") %>%
filter(regiao != "NA")
DT::datatable(df_4)
f <- df_4 %>%
ggplot(aes(x = mes_ano, y = total, col = regiao)) + geom_line() +
facet_wrap(~regiao, scales = "free_y") + theme_minimal() +
scale_x_date(date_breaks = "1 year") + theme(legend.position="none")
plotly::ggplotly(f)
Os seguintes código CID-10 foram utilizados para buscar os casos de covid-19, conforme recomendação de preenchimento para morbimortalidade doGuia de Vigilância Epidemiológica: Emergência de Saúde Pública de Importância Nacional pela Doença pelo Coronavírus 2019 - Covid-19, versão 4, 2022.
Diagnóstico + B34.2 - Infecção por coronavírus de localização não especificada + U07.1 - covid-19, vírus identificado. É atribuído a um diagnóstico da covid-19 confirmada por testes de laboratório + U07.2 (covid-19, vírus não identificado, clínico-epidemiológico. É atribuído a um diagnóstico clínico ou epidemiológico da covid-19, em que a confirmação laboratorial é inconclusiva ou não está disponível).
Os códigos U07.1 (covid-19, vírus identificado) e U07.2 (covid-19, vírus não identificado, clínico-epidemiológico), definidos pela Organização Mundial de Saúde (OMS), são os marcadores da pandemia no Brasil, devendo sempre vir após o código B34.2, na mesma linha.
Condições pós-COVID-19 + B94.8 (sequelas de outras doenças infecciosas e parasitárias especificadas). + U09.9 (condição de saúde posterior à covid-19, não especificada) + M30.3 (síndrome de linfonodos mucocutâneos – Kawasaki). + U10.9 (síndrome inflamatória multissistêmica associada à covid-19, não especificada)
Vacinação e evento adverso à vacina COVID + Y59.0 (vacinas antivirais) e T88.7 (efeito adverso não especificado de droga ou medicamento) + U12.9 (vacinas contra a covid-19 que causam efeitos adversos com finalidade terapêutica, não especificada)
Reincidência de COVID-19 + B34.2 (infecção pelo coronavírus de localização não especificada) + U92.1 (reincidência de covid-19, confirmada)
Buscamos todas as observações cujo diagnóstico principal OU secundário fossem dos CID-10 indicados acima.
internacoes <-
sqlQuery(channel, "SELECT ANO_CMPT, MES_CMPT, UF_ZI, MUNIC_RES, DT_INTER, DT_SAIDA, DIAS_PERM,
MORTE, DIAG_PRINC, DIAG_SECUN, CID_ASSO, CID_MORTE, uf, competencia,
CNES
FROM Dados.sih.RD
WHERE substr(DT_INTER, 1, 4) > 2019 AND
(DIAG_PRINC = 'B342' OR DIAG_PRINC = 'U071'
OR DIAG_PRINC = 'U072' OR DIAG_PRINC = 'B948'
OR DIAG_PRINC = 'U099' OR DIAG_PRINC = 'M303'
OR DIAG_PRINC = 'U109' OR DIAG_PRINC = 'Y590'
OR DIAG_PRINC = 'U129' OR DIAG_PRINC = 'U921'
OR DIAG_SECUN = 'B342' OR DIAG_SECUN = 'U071'
OR DIAG_SECUN = 'U072' OR DIAG_SECUN = 'B948'
OR DIAG_SECUN = 'U099' OR DIAG_SECUN = 'M303'
OR DIAG_SECUN = 'U109' OR DIAG_SECUN = 'Y590'
OR DIAG_SECUN = 'U129' OR DIAG_SECUN = 'U921') ", as.is = TRUE)
Fazendo uma análise exploratória rápida dos dados, observa-se que a maioria dos casos foram registrados sob o CID-10 B342.
internacoes %>%
group_by(DIAG_PRINC) %>%
count()
## # A tibble: 5 x 2
## # Groups: DIAG_PRINC [5]
## DIAG_PRINC n
## <chr> <int>
## 1 B342 1680102
## 2 B948 21
## 3 M303 515
## 4 U099 6
## 5 U109 11
Também vemos que a coluna diagnóstico secundário não foi preenchida nenhuma vez.
internacoes %>%
group_by(DIAG_SECUN) %>%
count()
## # A tibble: 1 x 2
## # Groups: DIAG_SECUN [1]
## DIAG_SECUN n
## <chr> <int>
## 1 0000 1680655
Vamos pegar o número de internações por mês conforme as condições listadas nos itens 1 e 2.
internacoes_hospitais_exist <-
internacoes %>%
janitor::clean_names() %>%
mutate(mes_ano = substr(dt_inter, 1, 6),
mes_ano = lubridate::ym(mes_ano),
ano = lubridate::year(mes_ano)) %>%
filter(cnes %in% cnes_2019c) %>%
group_by(ano, mes_ano, uf, cnes) %>%
summarise(total = n()) %>%
mutate(tipo_hosp = "hospitais existentes")
internacoes_hospitais_novos <-
internacoes %>%
janitor::clean_names() %>%
mutate(mes_ano = substr(dt_inter, 1, 6),
mes_ano = lubridate::ym(mes_ano),
ano = lubridate::year(mes_ano)) %>%
filter(cnes %ni% cnes_2019c) %>%
group_by(ano, mes_ano, uf, cnes) %>%
summarise(total = n()) %>%
mutate(tipo_hosp = "hospitais novos")
internacoes_total <- rbind(internacoes_hospitais_exist, internacoes_hospitais_novos)
g <- internacoes_total %>%
group_by(ano, tipo_hosp) %>%
summarise(total_internacoes = sum(total)) %>%
ggplot(aes(x = ano, y = total_internacoes,
fill = tipo_hosp)) + geom_col(position = "dodge") +
theme_minimal()
plotly::ggplotly(g)
obitos_hospitais_exist <-
internacoes %>%
janitor::clean_names() %>%
filter(morte == 1) %>%
mutate(mes_ano = substr(dt_inter, 1, 6),
mes_ano = lubridate::ym(mes_ano),
ano = lubridate::year(mes_ano)) %>%
filter(cnes %in% cnes_2019c) %>%
group_by(ano, mes_ano, uf, cnes) %>%
summarise(total = n()) %>%
mutate(tipo_hosp = "hospitais existentes")
obitos_hospitais_novos <-
internacoes %>%
janitor::clean_names() %>%
filter(morte == 1) %>%
mutate(mes_ano = substr(dt_inter, 1, 6),
mes_ano = lubridate::ym(mes_ano),
ano = lubridate::year(mes_ano)) %>%
filter(cnes %ni% cnes_2019c) %>%
group_by(ano, mes_ano, uf, cnes) %>%
summarise(total = n()) %>%
mutate(tipo_hosp = "hospitais novos")
obitos_total <- rbind(obitos_hospitais_exist, obitos_hospitais_novos)
h <- obitos_total %>%
group_by(ano, tipo_hosp) %>%
summarise(total_obitos = sum(total)) %>%
ggplot(aes(x = ano, y = total_obitos,
fill = tipo_hosp)) + geom_col(position = "dodge") +
theme_minimal()
plotly::ggplotly(h)
O gráfico acima apresenta as internações que tiveram óbito como desfecho.
dias_hospitais_exist <-
internacoes %>%
janitor::clean_names() %>%
mutate(mes_ano = substr(dt_inter, 1, 6),
mes_ano = lubridate::ym(mes_ano),
ano = lubridate::year(mes_ano)) %>%
filter(cnes %in% cnes_2019c) %>%
group_by(ano) %>%
summarise(dias_medios = round(mean(dias_perm),2)) %>%
mutate(tipo_hosp = "hospitais existentes")
dias_hospitais_novos <-
internacoes %>%
janitor::clean_names() %>%
mutate(mes_ano = substr(dt_inter, 1, 6),
mes_ano = lubridate::ym(mes_ano),
ano = lubridate::year(mes_ano)) %>%
filter(cnes %ni% cnes_2019c) %>%
group_by(ano) %>%
summarise(dias_medios = round(mean(dias_perm),2)) %>%
mutate(tipo_hosp = "hospitais novos")
media_dias_hospitais <- rbind(dias_hospitais_exist, dias_hospitais_novos)
i <- media_dias_hospitais %>%
ggplot(aes(x = ano, y = dias_medios,
fill = tipo_hosp)) + geom_col(position = "dodge") +
theme_minimal()
plotly::ggplotly(i)
Observa-se que, em média, tivemos médias muito próximas, por volta de 8 dias.